home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turnbull China Bikeride
/
Turnbull China Bikeride - Disc 1.iso
/
HENSA
/
MISC
/
SHELL.ARC
/
Shell
/
Sources
/
c
/
DBarGraph2
< prev
next >
Wrap
Text File
|
1994-06-25
|
3KB
|
145 lines
#include <stdio.h>
#include "DeskLib:WimpSWIs.h"
#include "Shell.Extra.h"
#include "Shell.BarGraph.h"
#include "Shell.SafeAlloc.h"
typedef struct {
int spacing;
int barwidth;
int height;
double *data;
int numbars;
int forecol, backcol;
double min, max;
double scale;
int zeroheight;
struct {
unsigned int autoscale : 1;
}
flags
;
}
Shell_dbarinfo2;
#define Shell_RecalculateBar( barinfo) { \
(barinfo)->scale = (barinfo)->height / ((barinfo)->max - (barinfo)->min); \
(barinfo)->zeroheight = (int) (- (barinfo)->min * (barinfo)->scale); \
} \
/*
#define MAX( a, b) ((a) > (b)) ? (a) : (b)
#define MIN( a, b) ((a) < (b)) ? (a) : (b)
*/
/* These are defined in DeskLib:Core.h */
static void Shell_DoubleBarRedrawer2(
Shell_convertpoint convert,
wimp_point rectsize,
void *reference,
const wimp_rect *redrawrect
)
{ Shell_dbarinfo2 *barinfo = (Shell_dbarinfo2 *) reference;
int imin, imax, i;
imin = MAX( redrawrect->min.x / barinfo->spacing, 0);
imax = MIN( redrawrect->max.x / barinfo->spacing + 1, barinfo->numbars);
if ( barinfo->flags.autoscale) {
double min = barinfo->min, max = barinfo->max;
for ( i=imin; i<imax; i++) {
Shell_MakeGE( max, barinfo->data[i]);
Shell_MakeLE( min, barinfo->data[i]);
}
if ( max != barinfo->max || min != barinfo->min) {
barinfo->min = min;
barinfo->max = max;
Shell_RecalculateBar( barinfo)
}
}
for ( i=imin; i<imax; i++) {
int y = (int) ( barinfo->data[i] * barinfo->scale + barinfo->zeroheight);
int x = i*barinfo->spacing;
int ymin, ymax;
if ( y < barinfo->zeroheight) {
ymin = y;
ymax = barinfo->zeroheight;
}
else {
ymin = barinfo->zeroheight;
ymax = y;
}
Wimp_SetColour( barinfo->forecol);
Shell_RectangleFill2( x, ymin, x + barinfo->barwidth, ymax, convert);
Wimp_SetColour( barinfo->backcol);
Shell_RectangleFill2( x, 0, x + barinfo->barwidth, ymin, convert);
Shell_RectangleFill2( x, ymax, x + barinfo->barwidth, rectsize.y, convert);
}
return;
}
Shell_rectblock *Shell_AddDoubleBarGraph2(
Shell_windblock *wind,
int x, int y,
int numbars, int spacing, int barwidth, int maxheight,
double *data,
double min,
double max,
BOOL autoscale,
int forecol, int backcol
)
{
Shell_dbarinfo2 *barinfo = (Shell_dbarinfo2 *) Shell_SafeMalloc( sizeof( Shell_dbarinfo2));
Shell_rectblock *rect;
barinfo->spacing = spacing;
barinfo->barwidth = barwidth;
barinfo->data = data;
barinfo->numbars = numbars;
barinfo->min = min;
barinfo->max = max;
barinfo->flags.autoscale = autoscale;
barinfo->forecol = forecol;
barinfo->backcol = backcol;
barinfo->height = maxheight;
Shell_RecalculateBar( barinfo)
rect = Shell_AddRectangle3( wind, x, y, spacing*numbars, maxheight, Shell_DoubleBarRedrawer2, barinfo);
Shell_MakeRectIcon( rect, forecol, backcol, "r2");
return rect;
}